#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
配置模块

负责管理多线程数据库同步工具的配置参数
"""

import argparse
import logging
import os
from typing import Optional


class Config:
    """
    配置类
    
    包含程序运行所需的所有配置参数，支持通过命令行参数覆盖默认值
    """
    
    def __init__(self):
        """初始化配置对象，解析命令行参数并设置默认值"""
        # 解析命令行参数
        parser = argparse.ArgumentParser(description='多线程数据库同步工具')
        
        # 线程池配置
        parser.add_argument('--max_workers', type=int, default=10,
                          help='线程池最大线程数，默认10')
        
        # 错误处理配置
        parser.add_argument('--ignore_errors', action='store_true',
                          help='忽略错误，当出现错误时只打印日志而不退出程序，默认为False')
        
        # 日志配置
        parser.add_argument('--log_level', type=str, default='INFO',
                          choices=['DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL'],
                          help='日志级别，默认INFO')
        parser.add_argument('--log_file', type=str, default='db_sync.log',
                          help='日志文件路径，默认db_sync.log')
        
        # 解析参数
        args = parser.parse_args()
        
        # 设置配置值
        self.max_workers: int = args.max_workers
        self.log_level: str = args.log_level
        self.log_file: str = args.log_file
        # 设置ignore_errors标志
        self.ignore_errors: bool = args.ignore_errors
        
        # 验证配置有效性
        self._validate_config()
    
    def _validate_config(self):
        """
        验证配置参数的有效性
        
        Raises:
            ValueError: 当配置参数无效时
        """
        # 验证线程池大小
        if self.max_workers <= 0:
            raise ValueError("最大线程数必须大于0")
        

        
        # 确保日志目录存在
        log_dir = os.path.dirname(self.log_file)
        if log_dir and not os.path.exists(log_dir):
            os.makedirs(log_dir)
    
    def __str__(self) -> str:
        """
        返回配置的字符串表示
        
        Returns:
            str: 配置信息字符串
        """
        return (f"Config("  
                f"max_workers={self.max_workers}, "
                f"ignore_errors={self.ignore_errors}, "
                f"log_level={self.log_level}, "
                f"log_file={self.log_file})")
    
    def to_dict(self) -> dict:
        """
        将配置转换为字典格式
        
        Returns:
            dict: 配置字典
        """
        return {
            'max_workers': self.max_workers,
            'ignore_errors': self.ignore_errors,
            'log_level': self.log_level,
            'log_file': self.log_file
        }